CBOW (Continuous Bag of Words) Embedding Abstrak#
Notebook ini menjelaskan implementasi CBOW embedding menggunakan Word2Vec untuk menganalisis teks abstrak penelitian. CBOW adalah salah satu arsitektur Word2Vec yang memprediksi kata target berdasarkan konteks kata-kata di sekitarnya.
Tujuan:#
Membuat embedding vektor untuk kata-kata dalam dataset abstrak penelitian
Menggunakan Word2Vec dengan arsitektur CBOW
Mengekstrak fitur numerik dari teks abstrak untuk analisis lebih lanjut
Menganalisis similaritas semantik antar abstrak penelitian
1. Instalasi Library#
Menginstal library yang diperlukan:
plotly: untuk visualisasi interaktifgensim: library utama untuk Word2Vec dan embedding
[1]:
%%capture
!pip install plotly
!pip install --upgrade gensim
2. Import Library dan Load Data#
Mengimport library yang diperlukan dan memuat dataset abstrak penelitian yang sudah dipreprocessing:
Dataset: hasil_preprocessing_abstrak.csv#
Dataset ini berisi abstrak-abstrak penelitian yang telah melalui proses preprocessing. Struktur data:
abstrak_id: Identifikasi unik untuk setiap abstrak penelitian
hasil_preprocessing: Teks abstrak yang sudah dibersihkan dan diproses
Karakteristik Data:#
Jumlah dokumen: 151 abstrak penelitian
Domain: Berbagai bidang penelitian (manajemen, teknologi, pendidikan, dll)
Bahasa: Indonesia
Format: Teks yang sudah dipreprocessing (tokenisasi, pembersihan, dll)
Library yang Digunakan:#
gensim.models: untuk Word2Vec dan FastTextpandas: untuk manipulasi datasklearn.decomposition.PCA: untuk reduksi dimensimatplotlibdanplotly: untuk visualisasinumpy: untuk operasi numerik
[2]:
from gensim.models import Word2Vec, FastText
import pandas as pd
import re
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
import plotly.graph_objects as go
import numpy as np
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('hasil_preprocessing_abstrak.csv')
df
[2]:
| abstrak_id | hasil_preprocessing | |
|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... |
| ... | ... | ... |
| 1021 | ABSTRAK\nPenelitian ini bertujuan untuk menget... | ['abstrak', 'teliti', 'tuju', 'hitung', 'tingk... |
| 1022 | ABSTRAK\nUswatun Hasanah, 160211100291, Pengar... | ['abstrak', 'uswatun', 'hasanah', 'pengaruh', ... |
| 1023 | ABSTRAK\nTujuan dari penelitian ini adalah unt... | ['abstrak', 'tuju', 'teliti', 'peran', 'servic... |
| 1024 | ABSTRAK\nPenelitian ini bertujuan: (1) Untuk m... | ['abstrak', 'teliti', 'tuju', 'baur', 'promosi... |
| 1025 | Penelitian ini bertujuan untuk dapat mengetahu... | ['teliti', 'tuju', 'pengaruh', 'motivasi', 'ke... |
1026 rows × 2 columns
3. Definisi Kelas Custom#
MyTokenizer#
Kelas untuk tokenisasi teks sederhana:
Mengubah teks menjadi lowercase
Memisahkan kata berdasarkan spasi
MeanEmbeddingVectorizer#
Kelas untuk mengubah teks menjadi vektor embedding:
Menggunakan model Word2Vec yang sudah dilatih
Mengambil rata-rata vektor kata untuk setiap dokumen
Menangani kata yang tidak ada dalam vocabulary
[3]:
from gensim.models import Word2Vec
4. Preprocessing Teks Abstrak#
Membersihkan teks abstrak penelitian dengan:
Konversi ke lowercase: Menyeragamkan format teks untuk konsistensi
Menghapus punctuation: Menghilangkan tanda baca dan karakter non-alfabet
Menghapus HTML tags: Membersihkan tag HTML jika ada dalam teks
Menghapus digit dan karakter khusus: Membersihkan angka dan karakter non-alfabet
Tujuan Preprocessing:#
Menyeragamkan format teks untuk analisis yang lebih baik
Menghilangkan noise yang dapat mengganggu proses embedding
Mempersiapkan teks untuk tokenisasi yang efektif
Hasil preprocessing disimpan dalam kolom ‘clean’.
[4]:
import numpy as np
class MyTokenizer:
def fit_transform(self, texts):
# Tokenisasi sederhana: lowercase + split
return [str(text).lower().split() for text in texts]
class MeanEmbeddingVectorizer:
def __init__(self, word2vec_model):
self.word2vec = word2vec_model
# Perbaikan: gunakan vector_size (Gensim ≥ 4.0)
self.dim = word2vec_model.wv.vector_size
def fit(self, X, y=None):
return self
def transform(self, X):
X_tokenized = MyTokenizer().fit_transform(X)
embeddings = []
for words in X_tokenized:
# Ambil vektor hanya untuk kata yang ada di vocab
valid_vectors = [
self.word2vec.wv[word] for word in words
if word in self.word2vec.wv
]
if valid_vectors:
embeddings.append(np.mean(valid_vectors, axis=0))
else:
embeddings.append(np.zeros(self.dim))
return np.array(embeddings)
def fit_transform(self, X, y=None):
return self.transform(X)
5. Pembuatan Corpus dan Training Word2Vec#
Pembuatan Corpus dari Abstrak#
Memecah teks abstrak yang sudah dibersihkan menjadi list kata
Setiap abstrak penelitian menjadi list kata terpisah
Corpus akan digunakan untuk melatih model Word2Vec
Training Model Word2Vec untuk Abstrak#
Arsitektur: CBOW (Continuous Bag of Words)
min_count=1: Termasuk semua kata (bahkan yang muncul sekali)
vector_size=56: Dimensi vektor embedding 56
Window: Konteks kata di sekitar kata target (default 5)
Model akan mempelajari representasi vektor untuk setiap kata berdasarkan konteksnya dalam abstrak penelitian
Keunggulan CBOW untuk Abstrak:#
Efektif untuk dataset kecil seperti abstrak penelitian
Mampu menangkap makna kata dalam konteks akademik
Cocok untuk analisis similaritas semantik antar penelitian
[5]:
clean_txt = []
for w in range(len(df['hasil_preprocessing'])):
desc = str(df['hasil_preprocessing'][w]).lower()
#remove punctuation
desc = re.sub('[^a-zA-Z]', ' ', desc)
#remove tags
desc=re.sub("</?.*?>"," <> ",desc)
#remove digits and special chars
desc=re.sub("(\\d|\\W)+"," ",desc)
clean_txt.append(desc)
df['clean'] = clean_txt
df.head()
[5]:
| abstrak_id | hasil_preprocessing | clean | |
|---|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... | abstrak satiyah pengaruh faktorfaktor latih k... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... | aplikasi nyata manfaat teknologi informasi ko... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... | tuju teliti persepsi brand association langga... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... | abstrak teliti metode kuantitatif tekan uji h... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... | abstrak tuju teliti identifikasi variabelvari... |
6. Eksplorasi Model Word2Vec untuk Abstrak#
Analisis Similaritas Kata dalam Konteks Akademik#
most_similar(): Mencari kata yang paling mirip dengan kata probe dalam konteks penelitian
most_similar_cosmul(): Mencari kata yang mirip dengan kombinasi kata positif dan negatif
doesnt_match(): Mencari kata yang tidak cocok dalam sekelompok kata terkait penelitian
Eksplorasi Vocabulary Abstrak#
Model akan mempelajari kata-kata khas dalam abstrak penelitian
Terminologi akademik dan teknis akan memiliki representasi vektor yang bermakna
Kata-kata seperti “penelitian”, “analisis”, “metode” akan memiliki similaritas tinggi
Penyimpanan Embedding#
Menyimpan vektor embedding dalam format Word2Vec
File:
abstrak_embd.txt(format teks, bukan binary)Embedding dapat digunakan untuk analisis lebih lanjut atau model lain
[6]:
df.shape
[6]:
(1026, 3)
7. Ekstraksi Embedding untuk Abstrak Penelitian#
Menggunakan MeanEmbeddingVectorizer untuk mengubah setiap abstrak penelitian menjadi vektor:
Input: Teks abstrak yang sudah dibersihkan
Proses:
Tokenisasi teks abstrak menjadi kata-kata
Ambil vektor embedding untuk setiap kata dari model Word2Vec
Hitung rata-rata vektor kata untuk mendapatkan representasi abstrak
Output: Vektor 56 dimensi untuk setiap abstrak penelitian
Keunggulan Mean Embedding untuk Abstrak:#
Menangkap makna keseluruhan abstrak penelitian
Mempertahankan informasi semantik dari terminologi akademik
Cocok untuk analisis similaritas antar penelitian
Memungkinkan clustering abstrak berdasarkan topik penelitian
[7]:
corpus = []
for col in df.clean:
word_list = col.split(" ")
corpus.append(word_list)
#show first value
corpus[0:1]
#generate vectors from corpus
model = Word2Vec(corpus, min_count=1, vector_size = 56)
8. Validasi Embedding#
Memeriksa panjang embedding untuk memastikan konsistensi:
Setiap dokumen harus memiliki vektor dengan panjang 56 (sesuai dengan vector_size)
Ini memastikan bahwa proses embedding berjalan dengan benar
[8]:
# Explore embeddings safely using an in-vocabulary token
# Pick a common Indonesian token if available, else fallback to the first vocab token
candidate_tokens = ['indonesia', 'pemerintah', 'jakarta', 'presiden', 'ekonomi']
probe = None
for tok in candidate_tokens:
if tok in model.wv:
probe = tok
break
if probe is None:
probe = model.wv.index_to_key[0]
print('Probe token:', probe)
print('Top similar:')
print(model.wv.most_similar(probe)[:10])
# Optional: cosine mul example if tokens exist
pos = [t for t in ['pemerintah', 'indonesia'] if t in model.wv]
neg = [t for t in ['oposisi'] if t in model.wv]
if pos:
print('Cosmul example:')
print(model.wv.most_similar_cosmul(positive=pos, negative=neg)[:10])
# Optional: doesnt_match example when enough tokens exist
cands = [t for t in ['ekonomi', 'politik', 'olahraga', 'jakarta'] if t in model.wv]
if len(cands) >= 3:
print('Odd-one-out:')
print(model.wv.doesnt_match(cands))
# Save embeddings
filename = 'abstrak_embd.txt'
model.wv.save_word2vec_format(filename, binary=False)
Probe token: indonesia
Top similar:
[('efek', 0.958017110824585), ('bursa', 0.9447913765907288), ('devisa', 0.9344190955162048), ('bei', 0.9310687780380249), ('daftar', 0.9256938099861145), ('periode', 0.921766459941864), ('kaca', 0.9186773300170898), ('estate', 0.9085423946380615), ('go', 0.9027281999588013), ('transportasi', 0.8972045183181763)]
Cosmul example:
[('efek', 0.9790076613426208), ('bursa', 0.9723947048187256), ('devisa', 0.9672086834907532), ('bei', 0.9655334949493408), ('daftar', 0.962846040725708), ('periode', 0.9608823657035828), ('kaca', 0.9593377709388733), ('estate', 0.9542703032493591), ('go', 0.951363205909729), ('transportasi', 0.9486013650894165)]
Odd-one-out:
ekonomi
9. Konversi Embedding ke DataFrame#
Mengubah array embedding abstrak menjadi DataFrame dengan kolom terpisah:
Input: Array embedding 2D (151 abstrak penelitian × 56 fitur)
Proses:
Membuat kolom f1, f2, …, f56 untuk setiap dimensi embedding
Mengisi setiap kolom dengan nilai dari dimensi yang sesuai
Output: DataFrame dengan 151 baris dan 56 kolom fitur
Tujuan: Memudahkan analisis dan visualisasi data abstrak penelitian
Manfaat Format DataFrame:#
Memudahkan analisis statistik pada setiap dimensi embedding
Kompatibel dengan library machine learning seperti scikit-learn
Memungkinkan visualisasi distribusi fitur per kategori penelitian
Memudahkan ekspor data untuk analisis lebih lanjut
12. Visualisasi Embedding Abstrak Penelitian#
Menambahkan visualisasi untuk menganalisis hasil embedding abstrak penelitian:
PCA Visualization: Reduksi dimensi untuk visualisasi 2D abstrak penelitian
Similarity Heatmap: Matriks similaritas antar abstrak penelitian
Embedding Distribution: Distribusi nilai embedding per kategori penelitian
Category Analysis: Analisis embedding berdasarkan bidang penelitian
Word Similarity Network: Jaringan similaritas kata dalam konteks akademik
Tujuan Visualisasi:#
Memahami pola distribusi abstrak penelitian dalam ruang embedding
Mengidentifikasi cluster penelitian berdasarkan topik
Menganalisis similaritas semantik antar penelitian
Memvalidasi kualitas embedding yang dihasilkan
[9]:
mean_embedding_vectorizer = MeanEmbeddingVectorizer(model)
mean_embedded = mean_embedding_vectorizer.fit_transform(df['clean'])
10. Penambahan Label (Opsional)#
Mencoba menambahkan kolom label jika tersedia:
Mencari kolom ‘kategori’ dalam DataFrame asli
Jika ditemukan, menyalin label ke DataFrame embedding
Jika tidak ditemukan, memberikan peringatan
Catatan: Label diperlukan untuk supervised learning atau evaluasi model.
[10]:
df['array']=list(mean_embedded)
11. Hasil Akhir#
Ringkasan Proses CBOW Embedding untuk Abstrak:#
Preprocessing: Membersihkan teks abstrak penelitian
Training Word2Vec: Membuat model CBOW dengan 56 dimensi
Ekstraksi Embedding: Mengubah abstrak penelitian menjadi vektor numerik
Konversi DataFrame: Mengubah array menjadi format tabular
Visualisasi: Analisis pola dan distribusi embedding
Output yang Dihasilkan:#
DataFrame embedding: 151 baris × 56 kolom fitur
File embedding:
abstrak_embd.txt(format Word2Vec)Model Word2Vec: Siap digunakan untuk analisis similaritas kata dalam konteks akademik
Visualisasi: PCA, heatmap, dan network analysis
Aplikasi Selanjutnya untuk Abstrak Penelitian:#
Clustering abstrak: Mengelompokkan penelitian berdasarkan topik
Klasifikasi bidang penelitian: Mengkategorikan abstrak berdasarkan domain
Analisis similaritas penelitian: Mencari penelitian yang mirip
Visualisasi embedding: PCA/t-SNE untuk eksplorasi pola penelitian
Recommendation system: Mencari penelitian terkait berdasarkan embedding
[11]:
df.head(5)
[11]:
| abstrak_id | hasil_preprocessing | clean | array | |
|---|---|---|---|---|
| 0 | ABSTRAK\r\nSatiyah, Pengaruh Faktor-faktor Pel... | ['abstrak', 'satiyah', 'pengaruh', 'faktorfakt... | abstrak satiyah pengaruh faktorfaktor latih k... | [0.36548746, 0.716385, 0.15957196, -0.3679199,... |
| 1 | Aplikasi nyata pemanfaatan teknologi informasi... | ['aplikasi', 'nyata', 'manfaat', 'teknologi', ... | aplikasi nyata manfaat teknologi informasi ko... | [0.16742007, 0.5279538, -0.11527466, -0.279942... |
| 2 | Tujuan penelitian ini adalah untuk mengetahui ... | ['tuju', 'teliti', 'persepsi', 'brand', 'assoc... | tuju teliti persepsi brand association langga... | [0.15432383, 0.6964137, -0.41081175, -0.452757... |
| 3 | Abstrak\r\nPenelitian ini menggunakan metode k... | ['abstrak', 'teliti', 'metode', 'kuantitatif',... | abstrak teliti metode kuantitatif tekan uji h... | [0.58658457, 1.0527209, -0.061899975, -0.90006... |
| 4 | ABSTRAK\r\n\r\nTujuan penelitian ini adalah un... | ['abstrak', 'tuju', 'teliti', 'identifikasi', ... | abstrak tuju teliti identifikasi variabelvari... | [0.31359524, 0.8989767, -0.098680854, -0.85267... |
[12]:
df['embedding_length'] = df['array'].str.len()
[13]:
print(df['embedding_length'])
0 56
1 56
2 56
3 56
4 56
..
1021 56
1022 56
1023 56
1024 56
1025 56
Name: embedding_length, Length: 1026, dtype: int64
[14]:
df.shape
[14]:
(1026, 5)
[15]:
num_features = len(df['array'].iloc[0]) # asumsi semua list punya panjang sama
columns = [f'f{i+1}' for i in range(num_features)]
# Inisialisasi dictionary untuk menampung data per kolom
data_dict = {col: [] for col in columns}
# Looping setiap baris di kolom 'embedding'
for embedding_list in df['array']:
for i, value in enumerate(embedding_list):
data_dict[f'f{i+1}'].append(value)
# Buat DataFrame dari dictionary
embedding_df = pd.DataFrame(data_dict)
embedding_df
[15]:
| f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | ... | f47 | f48 | f49 | f50 | f51 | f52 | f53 | f54 | f55 | f56 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.365487 | 0.716385 | 0.159572 | -0.367920 | 0.224299 | -0.008584 | 0.361405 | -0.523220 | 0.168144 | 0.046363 | ... | 0.643608 | 0.964336 | 0.065046 | 0.633086 | -0.098266 | 0.852551 | 0.207564 | 0.639124 | -0.007177 | -0.618843 |
| 1 | 0.167420 | 0.527954 | -0.115275 | -0.279942 | -0.004662 | -0.102450 | 0.611674 | -0.386023 | -0.035535 | 0.173587 | ... | 0.416687 | 0.591297 | 0.133505 | 0.607659 | 0.183871 | 0.454613 | -0.190961 | 0.609408 | 0.242703 | -0.334897 |
| 2 | 0.154324 | 0.696414 | -0.410812 | -0.452758 | 0.050656 | -0.123596 | 0.688204 | -0.365594 | -0.126446 | 0.134907 | ... | 0.756657 | 0.529345 | 0.043140 | 0.527827 | 0.344219 | 0.514495 | -0.303969 | 0.789283 | 0.346497 | -0.363010 |
| 3 | 0.586585 | 1.052721 | -0.061900 | -0.900069 | 0.297022 | 0.291881 | 0.512259 | -0.638588 | 0.400413 | 0.090068 | ... | 1.066514 | 1.110524 | -0.018310 | 0.830326 | -0.144583 | 0.871703 | 0.396844 | 0.809948 | 0.020211 | -0.725453 |
| 4 | 0.313595 | 0.898977 | -0.098681 | -0.852672 | 0.224413 | -0.075044 | 0.736564 | -0.296571 | 0.440990 | 0.380296 | ... | 1.118501 | 0.740074 | -0.085555 | 1.228455 | 0.000684 | 0.714946 | 0.184974 | 0.787050 | 0.521311 | -0.432489 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1021 | 0.073671 | 0.608046 | -0.054002 | -0.270766 | -0.107290 | 0.000393 | 0.268269 | -0.602032 | 0.010310 | -0.129304 | ... | 0.264000 | 0.426607 | 0.053954 | 0.253736 | 0.133076 | 0.452963 | -0.039510 | 0.589059 | 0.345337 | -0.548607 |
| 1022 | 0.593354 | 1.037423 | 0.422915 | -0.712085 | 0.214765 | 0.166399 | 0.054129 | -0.901139 | 0.624075 | -0.019217 | ... | 0.743601 | 1.158916 | 0.115424 | 0.966210 | -0.372967 | 1.069085 | 0.624109 | 0.513385 | -0.000435 | -1.011996 |
| 1023 | 0.350669 | 0.940788 | -0.331761 | -0.749276 | 0.028689 | 0.161183 | 0.615456 | -0.641041 | 0.224344 | 0.058748 | ... | 0.841594 | 0.721994 | 0.036967 | 0.583049 | 0.150275 | 0.597719 | 0.055457 | 0.764084 | 0.274789 | -0.650594 |
| 1024 | -0.126984 | 0.728735 | 0.106582 | -0.529795 | 0.202731 | -0.182372 | 0.762032 | -0.251091 | 0.195888 | 0.301766 | ... | 0.835412 | 0.552028 | -0.214962 | 1.344962 | 0.088150 | 0.517858 | 0.026125 | 0.700737 | 0.763998 | -0.047956 |
| 1025 | 0.679734 | 0.705006 | 0.270415 | -0.366951 | 0.314789 | 0.088967 | 0.257736 | -0.583103 | 0.152048 | -0.025278 | ... | 0.697545 | 1.217594 | 0.119447 | 0.769881 | -0.186109 | 0.946621 | 0.105962 | 0.677135 | -0.139797 | -0.689392 |
1026 rows × 56 columns
[16]:
# Cek apakah ada kolom label yang tersedia pada df
possible_labels = ['kategori', 'category', 'label', 'bidang', 'domain']
label_col = None
for c in possible_labels:
if c in df.columns:
label_col = c
break
if label_col is not None:
embedding_df[label_col] = df[label_col].values
print(f'✅ Kolom label "{label_col}" berhasil ditambahkan ke embedding_df')
else:
print('ℹ️ Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.')
print(' Kolom yang tersedia di df:', list(df.columns))
ℹ️ Tidak ditemukan kolom label di df. Visualisasi akan dilakukan tanpa kategori.
Kolom yang tersedia di df: ['abstrak_id', 'hasil_preprocessing', 'clean', 'array', 'embedding_length']
[17]:
embedding_df
[17]:
| f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | ... | f47 | f48 | f49 | f50 | f51 | f52 | f53 | f54 | f55 | f56 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.365487 | 0.716385 | 0.159572 | -0.367920 | 0.224299 | -0.008584 | 0.361405 | -0.523220 | 0.168144 | 0.046363 | ... | 0.643608 | 0.964336 | 0.065046 | 0.633086 | -0.098266 | 0.852551 | 0.207564 | 0.639124 | -0.007177 | -0.618843 |
| 1 | 0.167420 | 0.527954 | -0.115275 | -0.279942 | -0.004662 | -0.102450 | 0.611674 | -0.386023 | -0.035535 | 0.173587 | ... | 0.416687 | 0.591297 | 0.133505 | 0.607659 | 0.183871 | 0.454613 | -0.190961 | 0.609408 | 0.242703 | -0.334897 |
| 2 | 0.154324 | 0.696414 | -0.410812 | -0.452758 | 0.050656 | -0.123596 | 0.688204 | -0.365594 | -0.126446 | 0.134907 | ... | 0.756657 | 0.529345 | 0.043140 | 0.527827 | 0.344219 | 0.514495 | -0.303969 | 0.789283 | 0.346497 | -0.363010 |
| 3 | 0.586585 | 1.052721 | -0.061900 | -0.900069 | 0.297022 | 0.291881 | 0.512259 | -0.638588 | 0.400413 | 0.090068 | ... | 1.066514 | 1.110524 | -0.018310 | 0.830326 | -0.144583 | 0.871703 | 0.396844 | 0.809948 | 0.020211 | -0.725453 |
| 4 | 0.313595 | 0.898977 | -0.098681 | -0.852672 | 0.224413 | -0.075044 | 0.736564 | -0.296571 | 0.440990 | 0.380296 | ... | 1.118501 | 0.740074 | -0.085555 | 1.228455 | 0.000684 | 0.714946 | 0.184974 | 0.787050 | 0.521311 | -0.432489 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1021 | 0.073671 | 0.608046 | -0.054002 | -0.270766 | -0.107290 | 0.000393 | 0.268269 | -0.602032 | 0.010310 | -0.129304 | ... | 0.264000 | 0.426607 | 0.053954 | 0.253736 | 0.133076 | 0.452963 | -0.039510 | 0.589059 | 0.345337 | -0.548607 |
| 1022 | 0.593354 | 1.037423 | 0.422915 | -0.712085 | 0.214765 | 0.166399 | 0.054129 | -0.901139 | 0.624075 | -0.019217 | ... | 0.743601 | 1.158916 | 0.115424 | 0.966210 | -0.372967 | 1.069085 | 0.624109 | 0.513385 | -0.000435 | -1.011996 |
| 1023 | 0.350669 | 0.940788 | -0.331761 | -0.749276 | 0.028689 | 0.161183 | 0.615456 | -0.641041 | 0.224344 | 0.058748 | ... | 0.841594 | 0.721994 | 0.036967 | 0.583049 | 0.150275 | 0.597719 | 0.055457 | 0.764084 | 0.274789 | -0.650594 |
| 1024 | -0.126984 | 0.728735 | 0.106582 | -0.529795 | 0.202731 | -0.182372 | 0.762032 | -0.251091 | 0.195888 | 0.301766 | ... | 0.835412 | 0.552028 | -0.214962 | 1.344962 | 0.088150 | 0.517858 | 0.026125 | 0.700737 | 0.763998 | -0.047956 |
| 1025 | 0.679734 | 0.705006 | 0.270415 | -0.366951 | 0.314789 | 0.088967 | 0.257736 | -0.583103 | 0.152048 | -0.025278 | ... | 0.697545 | 1.217594 | 0.119447 | 0.769881 | -0.186109 | 0.946621 | 0.105962 | 0.677135 | -0.139797 | -0.689392 |
1026 rows × 56 columns
[18]:
embedding_df.shape
[18]:
(1026, 56)
[19]:
# 1. PCA Visualization untuk Embedding Abstrak
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
print("📊 Membuat PCA visualization untuk embedding abstrak penelitian...")
print(f" Shape embedding_df: {embedding_df.shape}")
# Reduksi dimensi dengan PCA
pca = PCA(n_components=2)
embedding_2d = pca.fit_transform(embedding_df.iloc[:, :]) # Gunakan semua kolom fitur
# Visualisasi dengan Matplotlib (tanpa kategori karena tidak tersedia)
plt.figure(figsize=(12, 8))
# Plot semua titik dengan warna yang sama karena tidak ada kategori
scatter = plt.scatter(embedding_2d[:, 0], embedding_2d[:, 1],
c='blue', alpha=0.7, s=50, label='Abstrak Penelitian')
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} variance)', fontsize=12)
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} variance)', fontsize=12)
plt.title('PCA Visualization of Abstract Research Embeddings', fontsize=14)
plt.legend(fontsize=12)
plt.grid(True, alpha=0.3)
# Tambahkan informasi tambahan
plt.text(0.02, 0.98, f'Total abstrak: {len(embedding_2d)}',
transform=plt.gca().transAxes, fontsize=10,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))
plt.tight_layout()
plt.show()
# Statistik PCA
print(f"\n📈 Statistik PCA:")
print(f" Explained variance ratio - PC1: {pca.explained_variance_ratio_[0]:.3f}")
print(f" Explained variance ratio - PC2: {pca.explained_variance_ratio_[1]:.3f}")
print(f" Total explained variance: {pca.explained_variance_ratio_.sum():.3f}")
print(f" Jumlah abstrak penelitian: {len(embedding_2d)}")
print(f" Dimensi asli: {embedding_df.shape[1]}")
print(f" Dimensi setelah PCA: {embedding_2d.shape[1]}")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat PCA visualization untuk embedding abstrak penelitian...
Shape embedding_df: (1026, 56)
📈 Statistik PCA:
Explained variance ratio - PC1: 0.489
Explained variance ratio - PC2: 0.214
Total explained variance: 0.703
Jumlah abstrak penelitian: 1026
Dimensi asli: 56
Dimensi setelah PCA: 2
[20]:
# 2. Similarity Heatmap untuk beberapa abstrak penelitian
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
# Ambil sample 20 abstrak untuk heatmap
sample_size = min(20, len(embedding_df))
sample_indices = np.random.choice(len(embedding_df), sample_size, replace=False)
sample_embeddings = embedding_df.iloc[sample_indices, :] # Gunakan semua kolom fitur
print(f"📊 Membuat similarity heatmap untuk {sample_size} abstrak penelitian...")
print(f" Shape sample embeddings: {sample_embeddings.shape}")
# Hitung cosine similarity
similarity_matrix = cosine_similarity(sample_embeddings)
# Visualisasi heatmap dengan Matplotlib
plt.figure(figsize=(12, 10))
im = plt.imshow(similarity_matrix, cmap='viridis', aspect='auto', vmin=0, vmax=1)
plt.colorbar(im, label='Cosine Similarity')
plt.title('Cosine Similarity Matrix of Abstract Research Embeddings (Sample)', fontsize=14)
plt.xlabel('Abstract Index', fontsize=12)
plt.ylabel('Abstract Index', fontsize=12)
# Tambahkan label indeks abstrak
for i in range(sample_size):
plt.text(i, -0.5, f'A{i+1}', rotation=45, ha='right', va='top', fontsize=8)
plt.text(-0.5, i, f'A{i+1}', rotation=0, ha='right', va='center', fontsize=8)
# Tambahkan grid untuk memudahkan membaca
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Statistik similarity
print(f"\n📈 Statistik Similarity Matrix:")
print(f" Shape: {similarity_matrix.shape}")
print(f" Average similarity: {similarity_matrix.mean():.3f}")
print(f" Max similarity: {similarity_matrix.max():.3f}")
print(f" Min similarity: {similarity_matrix.min():.3f}")
print(f" Standard deviation: {similarity_matrix.std():.3f}")
# Cari pasangan abstrak yang paling similar
np.fill_diagonal(similarity_matrix, 0) # Hapus diagonal (similarity dengan diri sendiri)
max_sim_idx = np.unravel_index(np.argmax(similarity_matrix), similarity_matrix.shape)
print(f" Most similar pair: A{max_sim_idx[0]+1} & A{max_sim_idx[1]+1} (similarity: {similarity_matrix[max_sim_idx]:.3f})")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat similarity heatmap untuk 20 abstrak penelitian...
Shape sample embeddings: (20, 56)
📈 Statistik Similarity Matrix:
Shape: (20, 20)
Average similarity: 0.803
Max similarity: 1.000
Min similarity: 0.395
Standard deviation: 0.132
Most similar pair: A7 & A11 (similarity: 0.990)
[21]:
# 3. Distribusi Embedding untuk Abstrak Penelitian
import matplotlib.pyplot as plt
import numpy as np
try:
# Cek apakah embedding_df sudah ada
if 'embedding_df' not in locals():
print("❌ Error: embedding_df belum dibuat. Jalankan cell sebelumnya terlebih dahulu.")
else:
print("📊 Membuat distribusi embedding untuk abstrak penelitian...")
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
axes = axes.ravel()
# Ambil beberapa fitur untuk dianalisis
feature_cols = ['f1', 'f2', 'f3', 'f4']
for i, feature in enumerate(feature_cols):
# Plot distribusi untuk semua abstrak (tanpa kategori)
data = embedding_df[feature]
axes[i].hist(data, alpha=0.7, color='skyblue', bins=20, edgecolor='black')
axes[i].set_title(f'Distribution of {feature} for Abstract Research', fontsize=12)
axes[i].set_xlabel(f'{feature} Value', fontsize=10)
axes[i].set_ylabel('Frequency', fontsize=10)
axes[i].grid(True, alpha=0.3)
# Tambahkan statistik
mean_val = data.mean()
std_val = data.std()
axes[i].axvline(mean_val, color='red', linestyle='--', linewidth=2, label=f'Mean: {mean_val:.3f}')
axes[i].axvline(mean_val + std_val, color='orange', linestyle=':', linewidth=2, label=f'±1σ: {std_val:.3f}')
axes[i].axvline(mean_val - std_val, color='orange', linestyle=':', linewidth=2)
axes[i].legend(fontsize=9)
plt.suptitle('Distribution of Embedding Features for Abstract Research', fontsize=14)
plt.tight_layout()
plt.show()
# Statistik detail
print(f"\n📈 Statistik Distribusi Embedding untuk 4 fitur pertama:")
print("-" * 60)
for feature in feature_cols:
data = embedding_df[feature]
print(f"{feature:>3}: Mean={data.mean():>7.3f}, Std={data.std():>7.3f}, Min={data.min():>7.3f}, Max={data.max():>7.3f}")
# Statistik keseluruhan
all_features = embedding_df.columns
print(f"\n📊 Statistik Keseluruhan ({len(all_features)} fitur):")
print(f" Mean keseluruhan: {embedding_df.values.mean():.3f}")
print(f" Std keseluruhan: {embedding_df.values.std():.3f}")
print(f" Min keseluruhan: {embedding_df.values.min():.3f}")
print(f" Max keseluruhan: {embedding_df.values.max():.3f}")
except Exception as e:
print(f"❌ Error: {e}")
print("Pastikan semua cell sebelumnya sudah dijalankan dengan benar.")
📊 Membuat distribusi embedding untuk abstrak penelitian...
📈 Statistik Distribusi Embedding untuk 4 fitur pertama:
------------------------------------------------------------
f1: Mean= 0.209, Std= 0.336, Min= -0.474, Max= 1.020
f2: Mean= 0.878, Std= 0.173, Min= 0.271, Max= 1.341
f3: Mean= -0.001, Std= 0.242, Min= -0.715, Max= 0.634
f4: Mean= -0.500, Std= 0.210, Min= -1.127, Max= 0.093
📊 Statistik Keseluruhan (56 fitur):
Mean keseluruhan: 0.053
Std keseluruhan: 0.576
Min keseluruhan: -2.298
Max keseluruhan: 2.291
[22]:
# 5. Analisis Similaritas Kata dengan Word2Vec
# Ambil beberapa kata yang ada dalam vocabulary
vocab_words = list(model.wv.key_to_index.keys())[:20] # Ambil 20 kata pertama
# Hitung similarity matrix untuk kata-kata
word_similarities = []
for word1 in vocab_words:
row = []
for word2 in vocab_words:
if word1 in model.wv and word2 in model.wv:
similarity = model.wv.similarity(word1, word2)
row.append(similarity)
else:
row.append(0)
word_similarities.append(row)
word_similarities = np.array(word_similarities)
# Visualisasi heatmap similarity kata
plt.figure(figsize=(12, 10))
plt.imshow(word_similarities, cmap='viridis', aspect='auto')
plt.colorbar(label='Word Similarity')
plt.title('Word Similarity Matrix (Word2Vec)')
plt.xlabel('Words')
plt.ylabel('Words')
# Set labels
plt.xticks(range(len(vocab_words)), vocab_words, rotation=45, ha='right')
plt.yticks(range(len(vocab_words)), vocab_words)
plt.tight_layout()
plt.show()
print(f"Vocabulary size: {len(model.wv.key_to_index)}")
print(f"Sample words: {vocab_words[:10]}")
Vocabulary size: 6500
Sample words: ['pengaruh', 'kerja', 'teliti', 'variabel', 'usaha', 'signifikan', 'uji', 'karyawan', '', 'nilai']
[23]:
# Test Plotly setelah install nbformat
import plotly.express as px
import pandas as pd
import numpy as np
# Buat data test sederhana
test_data = pd.DataFrame({
'x': np.random.randn(10),
'y': np.random.randn(10),
'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C']
})
# Test plotly
fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly')
fig.show()
print("✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.")
Data type cannot be displayed: application/vnd.plotly.v1+json
✅ Plotly berhasil dijalankan! Error nbformat sudah teratasi.
[24]:
# Solusi 2: Install ulang library di dalam notebook
import sys
!{sys.executable} -m pip install --upgrade nbformat ipython
Requirement already satisfied: nbformat in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (5.10.4)
Requirement already satisfied: ipython in c:\users\user\appdata\roaming\python\python311\site-packages (9.6.0)
Requirement already satisfied: fastjsonschema>=2.15 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (2.21.2)
Requirement already satisfied: jsonschema>=2.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from nbformat) (4.25.1)
Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.8.1)
Requirement already satisfied: traitlets>=5.1 in c:\users\user\appdata\roaming\python\python311\site-packages (from nbformat) (5.14.3)
Requirement already satisfied: colorama in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (0.4.6)
Requirement already satisfied: decorator in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (5.2.1)
Requirement already satisfied: ipython-pygments-lexers in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (1.1.1)
Requirement already satisfied: jedi>=0.16 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.19.2)
Requirement already satisfied: matplotlib-inline in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.1.7)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (3.0.52)
Requirement already satisfied: pygments>=2.4.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (2.19.2)
Requirement already satisfied: stack_data in c:\users\user\appdata\roaming\python\python311\site-packages (from ipython) (0.6.3)
Requirement already satisfied: typing_extensions>=4.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from ipython) (4.15.0)
Requirement already satisfied: wcwidth in c:\users\user\appdata\roaming\python\python311\site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython) (0.2.14)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in c:\users\user\appdata\roaming\python\python311\site-packages (from jedi>=0.16->ipython) (0.8.5)
Requirement already satisfied: attrs>=22.2.0 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (2025.9.1)
Requirement already satisfied: referencing>=0.28.4 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in c:\users\user\appdata\local\programs\python\python311\lib\site-packages (from jsonschema>=2.6->nbformat) (0.27.1)
Requirement already satisfied: platformdirs>=2.5 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (4.4.0)
Requirement already satisfied: pywin32>=300 in c:\users\user\appdata\roaming\python\python311\site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat) (311)
Requirement already satisfied: executing>=1.2.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (2.2.1)
Requirement already satisfied: asttokens>=2.1.0 in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (3.0.0)
Requirement already satisfied: pure-eval in c:\users\user\appdata\roaming\python\python311\site-packages (from stack_data->ipython) (0.2.3)
[25]:
# Solusi 3: Set renderer plotly yang berbeda
import plotly.io as pio
# Coba beberapa renderer yang berbeda
try:
# Renderer untuk Jupyter notebook
pio.renderers.default = "notebook"
print("✅ Renderer set ke 'notebook'")
except:
try:
# Renderer untuk browser
pio.renderers.default = "browser"
print("✅ Renderer set ke 'browser'")
except:
# Renderer HTML
pio.renderers.default = "html"
print("✅ Renderer set ke 'html'")
# Test dengan data sederhana
import plotly.express as px
import pandas as pd
import numpy as np
test_data = pd.DataFrame({
'x': [1, 2, 3, 4, 5],
'y': [2, 4, 1, 3, 5],
'category': ['A', 'B', 'A', 'C', 'B']
})
fig = px.scatter(test_data, x='x', y='y', color='category', title='Test Plotly dengan Renderer Baru')
fig.show()
✅ Renderer set ke 'notebook'